var placeDao = require('../daos/placeDao'),
	idService = require('./idService'),
	geoService = require('./geoService'),
	placeService = require('./placeService');

// -------------------------- CRUD SERVICES ----------------------------

module.exports.getAll = function (short, callback) {
	placeDao.getAll(short, callback);
}

module.exports.find = function (filters, callback) {
	placeDao.find(filters, callback);
}

module.exports.findOne = function (filters, callback) {
	placeDao.findOne(filters, callback);
}

module.exports.save = function (place, geo, callback) {
	if (geo) {
		geoService.save(geo, function(savedGeo) {
			place.geoId = savedGeo.id;
			savePlace(place, callback);
		});
	} else {
		savePlace(place, callback);
	}
}

function savePlace(place, callback) {
	if (!place.id) {
		idService.getId('places', function(err, placeId) {
			if (err) {
				callback(err);
				return;
			}
			if (placeId) {
				place.id = placeId;
				placeDao.upsert(place.id, place, function(err) {
					if (err)
						callback(err);
					else
						callback(false, place);
				});
			} else {
				console.log('ERROR: placeService save. Detalle: ' + err);
		  	  	callback('place getAutoId fail');
			}
		});
	} else {
		placeDao.upsert(place.id, place, function(err) {
			if (err)
				callback(err);
			else
				callback(false, place);
		});
	}
}

module.exports.remove = function (id, callback) {
	placeDao.remove(id, callback);
}

// -------------------------- OTHER UPGRADE SERVICES ----------------------------

/*
Seteo un dato geográfico al place. Puede ser un objeto ya almacenado en la DB (con Id)
o un nuevo objeto (sin Id)
*/
module.exports.setGeo = function (place, geo, callback) {
	if (geo.id) {
		//Si tiene id, compruebo que el dato geográfico exista
		geoService.findOne({id: geo.id}, function(err, savedGeo) {
			if (err) {
				callback(err);
				return;
			}
			if (savedGeo)
				setGeoId(place, geo.id, callback);
			else {
				console.log('ERROR: placeService setGeo. Detalle: ' + err);
	  	  		callback('geo with non-exist Id');
			}
		});
	} else {
		geoService.set(geo, function(err, savedGeo) {
			if (err)
				callback(err);
			else
				setGeoId(place, savedGeo.id, callback);
		});
	}
}

function setGeoId(place, geoId, callback) {
	placeDao.upsert(place.id, {$set : {geoId : geoId}}, callback);
}

/*
Seteo una o varias categorías a un place. Solo categorías existentes (con Id).
*/
module.exports.setCategories = function (place, categories, callback) {
	if (categories || categories.length <= 0)
		callback();

	categories.forEach(function(category) {
		if (category.id) {
			//Si tiene id, compruebo que la categoría exista
			categoryService.findOne({id: category.id}, function(err, savedCategory) {
				if (err) {
					callback(err);
					return;
				}
				if (savedCategory)
					addCategory(place, place.id, callback);
				else {
					console.log('ERROR: placeService setCategory. Detalle: ' + err);
		  	  		callback('category ' + JSON.stringify(category) + ' with non-exist Id');
				}
			});
		} else {
			console.log('ERROR: placeService setCategories. Detalle: ' + err);
  	  		callback('category ' + JSON.stringify(category) + 'without Id');
		}
	});
}

function addCategory(place, placeId, callback) {
	placeDao.upsert(place.id, {$push : {categories : placeId}}, callback);
}